package ecole.infrastructure;

import java.util.*;

import reservation.Reservation;

/**
 * Class Batiment : permet de construire un batiment contenant des salles
 * 
 * @author LUTTIAU Hadrien
 */
public class Batiment implements java.io.Serializable {

	private static final long serialVersionUID = 2L;

	public static List<Batiment> listeBatiment = new ArrayList<Batiment>();
	private String id;
	private int nbNiveaux;
	private ArrayList<Salle> liste_salle;
	private LinkedList<String> listeSallesReservees;

	/**
	 * Construit un batiment
	 */
	public Batiment() {
		this.id = "null";
		this.nbNiveaux = 1;
		this.liste_salle = new ArrayList<Salle>();
		this.listeSallesReservees = new LinkedList<String>();
		listeBatiment.add(this);
	}

	/**
	 * Construit un batiment
	 */
	public Batiment(String id, int nbnv) {
		this.id = id;
		this.nbNiveaux = nbnv;
		this.liste_salle = new ArrayList<Salle>();
		this.listeSallesReservees = new LinkedList<String>();
		listeBatiment.add(this);
	}

	/**
	 * Ajoute une salle � la liste des salles qui composent le b�timent
	 * 
	 * @param la
	 *            salle � ajouter � la liste des salles qui composent le
	 *            b�timent
	 */
	public void add_salle(Salle s) {
		s.id = this.id.toUpperCase().charAt(0)
				+ ((s.getNiveau() >= 0) ? ("+" + s.getNiveau() + s.id) : (s
						.getNiveau() + s.id));
		liste_salle.add(s);
	}

	/**
	 * Ajoute une salle � la liste des salles r�serv�es pour un b�timent
	 * 
	 * @param idSalle
	 *            L'identifiant de la salle � ajouter � la liste des salles
	 *            r�serv�es pour un b�timent
	 * @param date
	 *            La date de la r�servation
	 * @param creneau
	 *            Le creneau r�serv�
	 */
	public void reserverSalle(String idSalle, String date, int creneau) {
		listeSallesReservees.add(idSalle + "_" + date + "_" + creneau);
	}

	/**
	 * Recherche et renvoie l'identifiant d'une salle libre
	 * 
	 * @param type
	 *            Le type de la salle que l'utilisateur veut r�server
	 * @param date
	 *            La date de la r�servation
	 * @param creneau
	 *            Le creneau r�serv�
	 */
	public Salle rechercher(int type, Date date, int creneau) {
		if (listeSallesReservees == null)
			this.listeSallesReservees = new LinkedList<String>();

		switch (type) {
		case (0): {
			for (Salle s : liste_salle) { // S'il s'agit une salle d'amphiteatre
				if (s instanceof ecole.infrastructure.SalleAmphi) {
					if (trouverSalle(s, date, creneau))
						return s;
				}
			}
			break;
		}
		case (1): {
			for (Salle s : liste_salle) { // S'il s'agit une salle de cours
				if (s instanceof ecole.infrastructure.SalleCours) {
					if (trouverSalle(s, date, creneau))
						return s;
				}
			}
			break;
		}
		case (2): {
			for (Salle s : liste_salle) { // S'il s'agit une salle de reunion
				if (s instanceof ecole.infrastructure.SalleReunion) {
					if (trouverSalle(s, date, creneau))
						return s;
				}
			}
			break;
		}
		case (3): {
			for (Salle s : liste_salle) { // S'il s'agit une salle de TD
				if (s instanceof ecole.infrastructure.SalleTd) {
					if (trouverSalle(s, date, creneau))
						return s;
				}
			}
			break;
		}
		case (4): {
			for (Salle s : liste_salle) { // S'il s'agit une salle de TP avec
											// ordinateurs fixes
				if (s instanceof ecole.infrastructure.SalleTpFixe) {
					if (trouverSalle(s, date, creneau))
						return s;
				}
			}
			break;
		}
		case (5): {
			for (Salle s : liste_salle) { // S'il s'agit une salle de TP avec
											// ordinateurs portables
				if (s instanceof ecole.infrastructure.SalleTpPortable) {
					if (trouverSalle(s, date, creneau))
						return s;
				}
			}
			break;
		}
		}
		return null;
	}

	private boolean trouverSalle(Salle s, Date date, int creneau) {
		for (int i = 0; i < Reservation.getListeReservation().size(); i++) {
			if (Reservation.getListeReservation().get(i).getSalle().equals(s)
					&& Reservation.getListeReservation().get(i).getSeance()
							.getDate().equals(date)
					&& Reservation.getListeReservation().get(i).getSeance()
							.getCreneau() == creneau)
				return false;

		}
		return true;
	}

	/**
	 * Affiche la liste des salles disponibles pour un b�timent
	 * 
	 * @return la liste des salles disponibles
	 */
	public String toString() {
		String s = "Batiment " + id + "\nSalle disponible :\n";
		for (int i = 0; i < liste_salle.size(); i++) {
			s = s + liste_salle.get(i).id + "(" + liste_salle.get(i).getClass()
					+ ")" + "\n";
		}
		return s;
	}

	/**
	 * Renvoie la valeur de l'identifiant du b�timent
	 * 
	 * @return la valeur de l'identifiant du b�timent
	 */
	public String getId() {
		return id;
	}

	/**
	 * Fixe la valeur de l'identifiant du b�timent
	 * 
	 * @param la
	 *            valeur de l'identifiant du b�timent
	 */
	public void setId(String id) {
		this.id = id;
	}

	/**
	 * Renvoie le nombre de niveaux qui composent le b�timent
	 * 
	 * @return le nombre de niveaux qui composent le b�timent
	 */
	public int getNbNiveaux() {
		return nbNiveaux;
	}

	/**
	 * Renvoie la liste des salles qui composent le b�timent
	 * 
	 * @return la liste des salles qui composent le b�timent
	 */
	public ArrayList<Salle> getListe_salle() {
		return this.liste_salle;
	}

}
